package com.sc.sc250601.cook.util;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.UUID;

// 文件上传和下载的工具类 --- 只适用于SpringBoot
public class UpDowns {

    private static String getString()  {
        // 1. 获取内置tomcat虚拟地址
        String path = null;
        try {
            path = ResourceUtils.getFile("classpath:").getPath();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        path = path + "/static/upload/";
        // 前端通过 http://ip:端口/static/upload/xx.png 访问
        // 如果前端跨域成功了  /api/static/upload/Xx.png
        return path;
    }

    /**
     * 文件上传
     * @param myHead
     * @param
     * @return
     */
    public static String upload(MultipartFile myHead){
        // 文件上传：文件不会存储到数据库，一般存储在文件服务器或云服务器
        // 也可以存储到本地磁盘的项目服务器位置
        // 数据库存储文件地址，这样前端就可以通过地址访问服务器存储的对应图片

        String path = getString();

        File f = new File(path);
        if (!f.exists()) f.mkdirs();
        // 2. 保存的文件名一定要不是上传的文件名（可能会有重名）
        // 文件名需要随机处理，后缀名需要保留
        // 获取上传的文件名
        String filename = myHead.getOriginalFilename();
        // 如果前端没传文件,不是null，是空字符串
        if(filename.equals("")) return null;
        // 获取最后一个点后面的字符串---后缀名
        String suffix = filename.substring(filename.lastIndexOf("."));
        // 随机文件名，通过UUID，它可以生产32位永不重复的字符串
        String name = UUID.randomUUID().toString();
        // 开始上传文件
        File newFile = new File(path + name + suffix);
        try {
            myHead.transferTo(newFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 不用返回绝对地址
        return name+suffix;
    }

    /**
     * 下载文件
     * @param filename
     * @return
     */
    public static ResponseEntity<byte[]> download(String filename){
        // 1. 创建头部信息
        HttpHeaders headers = new HttpHeaders();
        // 2. 通过请求头信息设置文档类型，设置流的格式
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 3. 【可选操作】设置文件名的编码方式。如果文件名filename是中文也可以识别
        byte[] bs = null;
        try {
            filename = URLEncoder.encode(filename, "utf-8");
            // 4. 指定福建形式下载，同时可以指定下载后文件名
            headers.setContentDispositionFormData("attachment", filename);
            // 5. 读取文件，生成字节数组
            // 获取项目在服务器的真实路径 + /upload
            //String path = req.getServletContext().getRealPath("/upload/");//获取
            String path = getString();
            File f = new File(path+filename);
            //bs = FileUtils.readFileToByteArray(f);
            FileInputStream fis = new FileInputStream(f);
            bs = new byte[fis.available()];
            fis.read(bs);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return new ResponseEntity<>(bs,headers, HttpStatus.CREATED);
    }
}

